package com.lemon.cloud.lock;

import java.util.concurrent.TimeUnit;

/**
 * @author lemon
 * @return
 * @description 分布式锁接口
 * @date 2019-09-05 12:38
 */
public interface DistributedLock {
    /**
     * 默认锁过期时间
     */
    long DEFAULT_LOCK_EXPIRE_TIME = 5000;

    /**
     * 默认锁过期单位毫秒
     */
    TimeUnit DEFAULT_LOCK_EXPIRE_TIME_UNIT = TimeUnit.MILLISECONDS;

    /**
     * 默认重试次数
     */
    int DEFAULT_RETRY_TIMES = 3;

    /**
     * 默认重试间隔时间
     */
    long DEFAULT_RETRY_INTERVAL = 2000;

    /**
     * 默认重试间隔时间单位毫秒
     */
    TimeUnit DEFAULT_RETRY_INTERVAL_TIME_UNIT = TimeUnit.MILLISECONDS;

    /**
     * @param key key值
     * @return boolean 成功/失败
     * @description 获取锁: 如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 12:55
     */
    boolean lock(String key);

    /**
     * @param key        key值
     * @param retryTimes 重试次数
     * @return void
     * @description 获取锁: 重试retryTimes次，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:06
     */
    boolean lock(String key, int retryTimes);

    /**
     * @param key           key值
     * @param retryTimes    重试次数
     * @param retryInterval 获取锁失败重试间隔时间
     * @return void
     * @description 获取锁: 重试retryTimes次，每次间隔retryInterval时间，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:07
     */
    boolean lock(String key, int retryTimes, long retryInterval);

    /**
     * @param key               key值
     * @param retryTimes        重试次数
     * @param retryInterval     获取锁失败重试间隔时间
     * @param retryIntervalUnit 获取锁失败重试间隔时间单位
     * @return void
     * @description 获取锁: 重试retryTimes次，每次间隔retryInterval时间，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:07
     */
    boolean lock(String key, int retryTimes, long retryInterval, TimeUnit retryIntervalUnit);

    /**
     * @param key        key值
     * @param expireTime 获取锁超时时间
     * @return void
     * @description 获取锁: 超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:08
     */
    boolean lock(String key, long expireTime);

    /**
     * @param key            key值
     * @param expireTime     获取锁超时时间
     * @param expireTimeUnit 获取锁超时时间单位
     * @return void
     * @description 获取锁: 超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:08
     */
    boolean lock(String key, long expireTime, TimeUnit expireTimeUnit);

    /**
     * @param key        key值
     * @param expireTime 获取锁超时时间
     * @param retryTimes 重试次数
     * @return void
     * @description 获取锁: 超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:08
     */
    boolean lock(String key, long expireTime, int retryTimes);

    /**
     * @param key            key值
     * @param expireTime     获取锁超时时间
     * @param expireTimeUnit 获取锁超时时间单位
     * @param retryTimes     重试次数
     * @param retryInterval  获取锁失败重试间隔时间
     * @return void
     * @description 获取锁: 重试retryTimes次，每次超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-04 12:36
     */
    boolean lock(String key, long expireTime, TimeUnit expireTimeUnit, int retryTimes, long retryInterval);

    /**
     * @param key               key
     * @param expireTime        获取锁超时时间
     * @param expireTimeUnit    获取锁超时时间单位
     * @param retryTimes        重试次数
     * @param retryInterval     获取锁失败的重试间隔
     * @param retryIntervalUnit 获取锁失败重试间隔时间单位
     * @return boolean
     * 获取锁: 重试retryTimes次，间隔retryInterval时间重试下一次，每次超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-08 19:55
     */
    boolean lock(String key, long expireTime, TimeUnit expireTimeUnit, int retryTimes, long retryInterval, TimeUnit retryIntervalUnit);

    /**
     * @param key key值
     * @return boolean 成功/失败
     * @description 获取锁可中断: 如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 12:55
     */
    boolean lockInterruptibly(String key) throws InterruptedException;

    /**
     * @param key        key值
     * @param retryTimes 重试次数
     * @return void
     * @description 获取锁可中断: 重试retryTimes次，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:06
     */
    boolean lockInterruptibly(String key, int retryTimes) throws InterruptedException;

    /**
     * @param key           key值
     * @param retryTimes    重试次数
     * @param retryInterval 获取锁失败的重试间隔
     * @return void
     * @description 获取锁可中断: 重试retryTimes次，每次间隔retryInterval时间，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:07
     */
    boolean lockInterruptibly(String key, int retryTimes, long retryInterval) throws InterruptedException;

    /**
     * @param key               key值
     * @param retryTimes        重试次数
     * @param retryInterval     获取锁失败重试间隔时间
     * @param retryIntervalUnit 获取锁失败重试间隔时间单位
     * @return void
     * @description 获取锁可中断: 重试retryTimes次，每次间隔retryInterval时间，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:07
     */
    boolean lockInterruptibly(String key, int retryTimes, long retryInterval, TimeUnit retryIntervalUnit) throws InterruptedException;

    /**
     * @param key        key值
     * @param expireTime 获取锁超时时间
     * @return void
     * @description 获取锁可中断: 重试retryTimes次，每次间隔retryInterval时间，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:08
     */
    boolean lockInterruptibly(String key, long expireTime) throws InterruptedException;

    /**
     * @param key            key值
     * @param expireTime     获取锁超时时间
     * @param expireTimeUnit 获取锁超时时间单位
     * @return void
     * @description 获取锁可中断: 超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-02 13:08
     */
    boolean lockInterruptibly(String key, long expireTime, TimeUnit expireTimeUnit) throws InterruptedException;

    /**
     * @param key            key值
     * @param expireTime     获取锁超时时间
     * @param expireTimeUnit 获取锁超时时间单位
     * @param retryTimes     重试次数
     * @return void
     * @description 获取锁可中断: 重试retryTimes次，每次超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-04 12:49
     */
    boolean lockInterruptibly(String key, long expireTime, TimeUnit expireTimeUnit, int retryTimes) throws InterruptedException;

    /**
     * @param key            key
     * @param expireTime     获取锁超时时间
     * @param expireTimeUnit 获取锁超时时间单位
     * @param retryTimes     重试次数
     * @param retryInterval  获取锁失败的重试间隔
     * @return void
     * @description 获取锁可中断: 重试retryTimes次，间隔retryInterval时间重试下一次，每次超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     * @date 2019-09-04 12:47
     */
    boolean lockInterruptibly(String key, long expireTime, TimeUnit expireTimeUnit, int retryTimes, long retryInterval) throws InterruptedException;

    /**
     * @param key               key
     * @param expireTime        获取锁超时时间
     * @param expireTimeUnit    获取锁超时时间单位
     * @param retryTimes        重试次数
     * @param retryInterval     获取锁失败的重试间隔
     * @param retryIntervalUnit 获取锁失败重试间隔时间单位
     * @return 成功/失败
     * @description 获取锁可中断: 重试retryTimes次，间隔retryInterval时间重试下一次，每次超时时间expireTime，如果锁定不可用，则当前线程将被禁用以进行线程调度，并且在获取锁之前处于休眠状态。
     * @author lemon
     */
    boolean lockInterruptibly(String key, long expireTime, TimeUnit expireTimeUnit, int retryTimes, long retryInterval, TimeUnit retryIntervalUnit) throws InterruptedException;

    /**
     * @param key key值
     * @return boolean
     * @description 只有在调用时它是空闲的才能获取锁。
     * @author lemon
     * @date 2019-09-02 12:53
     */
    boolean tryLock(String key) throws InterruptedException;

    /**
     * @param key            key值
     * @param expireTime
     * @param expireTimeUnit
     * @return boolean
     * @description 如果锁在给定的等待时间内是空闲的并且当前线程尚未获得，则获取锁。
     * @author lemon
     * @date 2019-09-02 12:53
     */
    boolean tryLock(String key, long expireTime, TimeUnit expireTimeUnit) throws InterruptedException;

    /**
     * @param key key值
     * @return void
     * @description 释放锁
     * @author lemon
     * @date 2019-09-04 12:49
     */
    boolean unlock(String key);
}
